#pragma once

#define DECLARE_MEMBER_SET(type, name)							\
	virtual void set_##name(type value) { this->_##name = value; }			

#define DECLARE_MEMBER_GET(type, name)							\
	virtual type name##() const { return this->_##name; }					

#define DECLARE_MEMBER_PRIVATE(type, name)						\
	type _##name;												


#define DECLARE_MEMBER(type, name) 					\
public:												\
	DECLARE_MEMBER_SET(type, name)					\
	DECLARE_MEMBER_GET(type, name)					\
protected:											\
	DECLARE_MEMBER_PRIVATE(type, name)		


	
#define DECLARE_FLAG_GET_MEMBER(type, name) 		\
public:												\
	type name##() const { return this->_##name; }	\
protected:											\
	DECLARE_MEMBER_PRIVATE(type, name)


#define DECLARE_GET_MEMBER(type, name)				\
public:												\
	DECLARE_MEMBER_GET(type, name)					\
protected:											\
	DECLARE_MEMBER_PRIVATE(type, name)

#define DECLARE_SET_MEMBER(type, name)				\
public:												\
	DECLARE_MEMBER_SET(type, name)					\
protected:											\
	DECLARE_MEMBER_PRIVATE(type, name)				


#define DECLARE_INTERFACE_MEMBER_SET(type, name)				\
	virtual void set_##name(const ##type value) = 0;								

#define DECLARE_INTERFACE_MEMBER_GET(type, name)				\
	virtual type ##name() const = 0;										


#define DECLARE_INTERFACE_MEMBER(type, name) 					\
public:															\
	DECLARE_INTERFACE_MEMBER_SET(type, name)					\
	DECLARE_INTERFACE_MEMBER_GET(type, name)					


#define DECLARE_INTERFACE_GET_MEMBER(type, name)	\
public:												\
	DECLARE_INTERFACE_MEMBER_GET(type, name)		
